#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/display.h>
#include <zephyr/drivers/gpio.h>
#include <lvgl.h>
#include <lv_demos.h>

#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>

#include "ui_test.h"
#include "lv_port_indev.h"

#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(ui_main);



__attribute__((__weak__)) int ui_main_init(void)
{
	return 0;
}



void lvgl_thread(void * arg1, void * arg2, void * arg3)
{
	// 初始化
	const struct device *display_dev;

	// 获取当前设备树节点.
	display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
	if (!device_is_ready(display_dev)) {
		LOG_ERR("Device not ready, aborting test");
		return ;
	}

	// TDO. 初始化你的输入设备.
	lv_port_indev_init();

#if defined(CONFIG_LV_USE_DEMO_MUSIC)
	lv_demo_music();
#elif defined(CONFIG_LV_USE_DEMO_BENCHMARK)
	lv_demo_benchmark();
#elif defined(CONFIG_LV_USE_DEMO_STRESS)
	lv_demo_stress();
#elif defined(CONFIG_LV_USE_DEMO_WIDGETS)
	lv_demo_widgets();
#elif defined(CONFIG_GUI_TEST_ENABLED)
	
	// UI 测试界面.
	ui_main_test();
#else

	// TDO. 初始化你的显示界面.
	// 当前界面功能,
	ui_main_init();
#endif

	// 刷新显示一次界面内容.
	lv_task_handler();
	// 打开背光显示.
	display_blanking_off(display_dev);

	while (1) {

		lv_task_handler();
		k_sleep(K_MSEC(10));
	}
}


// 注意任务优先级,需要根据你的任务优先级来定义最高优先级,
// 越小优先级越高, 
// -CONFIG_NUM_COOP_PRIORITIES > CONFIG_NUM_PREEMPT_PRIORITIES
K_THREAD_DEFINE(lvgl_thread_id, 2048, lvgl_thread, NULL, NULL, NULL, 1, 0, 0);

